
package com.sailing.lianxi.thread;

import java.util.Date;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
 * 总结：
scheduleAtFixedRate ，是以上一个任务开始的时间计时，period时间过去后，检测上一个任务是否执行完毕，如果上一个任务执行完毕，则当前任务立即执行，如果上一个任务没有执行完毕，则需要等上一个任务执行完毕后立即执行。
scheduleWithFixedDelay，是以上一个任务结束时开始计时，period时间过去后，立即执行。
重点：
两个方法以不同的时间点作为参考。
 * 类名称：ScheduleExecutorServiceTest
 * 类描述：TODO
 * 创建人：wanggang
 * 创建时间：2018年4月18日 下午4:39:51
 * 修改人：wanggang
 * 修改时间：2018年4月18日 下午4:39:51
 * 修改备注：
 */
public class ScheduleExecutorServiceTest {
    public static void main(String[] args) {  
        ScheduleExecutorServiceTest test = new ScheduleExecutorServiceTest();  
        test.testWithFixedDelay();  
    }  
      
    private ScheduledExecutorService executor;  
      
    public ScheduleExecutorServiceTest() {  
        executor = Executors.newScheduledThreadPool(4);  
    }  
      
    public void testAtFixedRate() {  
        executor.scheduleAtFixedRate(new Runnable() {  
              
            public void run() {  
                System.out.println("开始执行:"+new Date());  
                try {  
                    Thread.sleep(10000);  
                    System.out.println("执行完毕");  
                } catch (InterruptedException e) {  
                    e.printStackTrace();  
                }  
            }  
        }, 1000, 3000, TimeUnit.MILLISECONDS);  
    }  
      
    public void testWithFixedDelay() {  
        executor.scheduleWithFixedDelay(new Runnable() {  
              
            public void run() {  
                System.out.println("====");  
                try {  
                    int i = 1 / 0;  
                } catch (Exception e) {  
                    e.printStackTrace();  
                }  
                /* 
                try { 
                    Thread.sleep(10000); 
                    System.out.println("执行完毕"); 
                } catch (InterruptedException e) { 
                    e.printStackTrace(); 
                } 
                */  
            }  
        }, 1000, 3000, TimeUnit.MILLISECONDS);  
    }  
}

